/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package logica.validacion;

import hibernate.objeto.ObraSocial;
import hibernate.objeto.Paciente;
import java.util.StringTokenizer;
import java.util.Vector;
import java.util.regex.Pattern;
import logica.ObraSocialLogica;

/**
 *
 * @author Gonzalo
 */
public class ObraSocialValidacion extends CapaValidacion {

    /**
     * Determina si un nombre de obra social es válido o no.
     *
     * @param nombre El nombre de la obra social
     * @param esObligatorio Obligatoriedad del campo
     * @return true si es válido, false en csao contrario
     *
     */
    public static boolean validarDetalleObraSocial(String nombre,
            boolean esObligatorio) {
        boolean esValido = true;
        String nombreTemp = nombre.toLowerCase();

        if ((esObligatorio && nombre.isEmpty()) || esCadenaVacia(nombre)) {
            esValido = false;
        }

        //Separamos palabras si es que existen y se trabaja cada palabra
        StringTokenizer tokens = new StringTokenizer(nombreTemp);
        while (tokens.hasMoreTokens()) {
            String palabra = tokens.nextToken();

            //Si la palabra no es todo números analizo si es correcta
            //de lo contrario valida permitiendo todo números
            if (!CapaValidacion.esTodoNumero(palabra)) {

                //Cada palabra debe tener al menos dos letras
                if (palabra.length() < 2) {
                    esValido = false;

                } else //No debe tener ñ y ' al mismo tiempo
                if (palabra.contains("ñ") && palabra.contains("\'")) {
                    esValido = false;

                } else //No debe tener mas de un apostrofo
                if (palabra.indexOf("\'") != palabra.lastIndexOf("\'")) {
                    esValido = false;

                } else //no debe tener apostrofo al principio ni al final
                if ((palabra.indexOf("\'") == 0) ||
                        (palabra.indexOf("\'") >= (palabra.length() - 1))) {
                    esValido = false;

                } else //Debe ser una cadena alfabetica
                if (!CapaValidacion.esAlfabeticoConPunto(palabra)) {
                    esValido = false;

                }
            }
        }
        return esValido;
    }

    /**
     * Determina si el par número de afiliación, obra social es válido.
     *
     * @param paciente El paciente que tiene la obra social
     * @param numeroAfiliacion El número de afiliación
     * @param obraSocial La obra social
     * @return true si es válido, false en caso contrario
     */
    public static boolean validarNumeroAfiliacion(Paciente paciente,
            String numeroAfiliacion, ObraSocial obraSocial) {
        boolean esValido = true;
        boolean esUnico = true;
        Pattern patron = Pattern.compile("[0-9]*");

        if (obraSocial == null && !numeroAfiliacion.isEmpty()) {
            esValido = false;
        }

        //La longitud ya es validada
        if (obraSocial != null &&
                (!obraSocial.getDetalleObraSocial().isEmpty() &&
                numeroAfiliacion.isEmpty() ||
                obraSocial.getDetalleObraSocial().isEmpty() &&
                !numeroAfiliacion.isEmpty())) {
            esValido = false;
        }

        if (!patron.matcher(numeroAfiliacion).matches()) {
            esValido = false;
        }

        if (esValido) {
            esUnico = esObraSocialYNumeroAfiliacionUnico(paciente,
                    numeroAfiliacion, obraSocial);
        }
                
        return esValido && esUnico;
    }

    /**
     * Valida si el par número de afiliación, obra social existe en la base de
     * datos.
     *
     * @param paciente El paciente que tiene la obra social
     * @param numeroAfiliacion El número de afiliación del paciente
     * @param obraSocial La obra social
     * @return true si es único, false en caso contrario
     */
    public static boolean esObraSocialYNumeroAfiliacionUnico(Paciente paciente,
            String numeroAfiliacion, ObraSocial obraSocial) {

        if (numeroAfiliacion.isEmpty() && obraSocial == null) {
            return true;
        }

        Vector<String> vectorNumeroDeAfiliacion = new Vector<String>();

        //Recupero todos los pacientes que tienen esa obra social
        ObraSocial objObraSocial = ObraSocialLogica.getObraSocialPorId(
                obraSocial.getIdObraSocial());
        Vector<Paciente> vectorPaciente =
                ObraSocialLogica.getVectorPacientePorIdObraSocial(
                objObraSocial.getIdObraSocial());

        if (vectorPaciente == null) {
            return true;
        } else {
            //Elimina el propio paciente que se esta modificando del vector
            vectorPaciente.remove(paciente);

            //Agrega los numeros de afiliación al vector
            for (int i = 0; i < vectorPaciente.size(); i++) {
                vectorNumeroDeAfiliacion.add(
                        vectorPaciente.get(i).
                        getNumeroAfiliacionObraSocialPaciente());
            }

            //Cheque si el numero de afiliación existe en el vector
            if (!vectorNumeroDeAfiliacion.contains(numeroAfiliacion)) {
                return true;
            } else {
                return false;
            }
        }
    }
}
